<?php
require_once ("C_krn_bd.php");
require_once ("C_krn_tools.php");
require_once ("C_krn_exception.php");

class c_sesion {
	// Variables de los usuarios
	private $TIMESTAMP;
	
	/* Evitamos el clonaje del objeto. Patrón Singleton */
	private function __clone() {
	}
	private function __wakeup() {
	}
	public function getTIMESTAMP() {
		return $this->TIMESTAMP;
	}
	public function setTIMESTAMP($pTIMESTAMP) {
		$this->TIMESTAMP = $pTIMESTAMP;
	}
	
	// Variables generales de la sesion
	private $EstaLogeado = FALSE;
	
	// Tipo de Usuario
	private $TIPO = - 1;
	
	// Funciones get set
	public function getTIPO() {
		return $this->TIPO;
	}
	public function setTIPO($pTIPO) {
		$this->TIPO = $pTIPO;
	}
	
	public function esAdmin () {
	  return $this->getSESSION ( 'SESSION_ADMIN' );
	}
	
	// Funciones get set
	public function getEstaLogeado() {
		return $this->EstaLogeado;
	}

	public function setEstaLogeado($pEstaLogeado) {
		global $cAUDIT;
		global $IDIOMA, $language;
		
		$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, ($pEstaLogeado ? $language [$IDIOMA] [68] : $language [$IDIOMA] [69])."( ".$this->getSESSION ( 'SESSION_EMAIL' )." )" );
		
		$this->EstaLogeado = $pEstaLogeado;
	}

	public function setSESSION($pDATO, $pVALOR) {
		global $cAUDIT;
		global $IDIOMA, $language;
		
		$_SESSION [$pDATO] = $pVALOR;
		
		$cAUDIT->AddAudit ( AUDIT_SESSION, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [94] . $pDATO . " --> " . $pVALOR );
	}

	public function getSESSION($pDATO) {
		global $cAUDIT;
		global $IDIOMA, $language;
		
		if (isset ( $_SESSION [$pDATO] )) {
		  $cAUDIT->AddAudit ( AUDIT_SESSION, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [95] . $pDATO . " --> " . $_SESSION [$pDATO] );
			return $_SESSION [$pDATO];
		} else {
			return false;
		}
	}

	public function defSESSION($pDATO) {
		IF (isset ( $_SESSION [$pDATO] ))
			RETURN TRUE;
		else
			RETURN FALSE;
	}
	
	/*
	 * public function dropVariableSESSION ( $pDATO ) { unset ( $_SESSION [$pDATO] ); } public function destroySESSION () { $_SESSION = array(); session_destroy (); }
	 */
	
	// Inicialización del objeto
	function __construct() {
		global $cAUDIT;
		
		$cAUDIT->AddAudit ( AUDIT_EXTEND, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "::constructor (" . __CLASS__ . ")" );
		
		// Actualizamos la hora de la sesion
		$this->setTIMESTAMP ( time () );
		
		// Al empezar no está logeado
		$this->setEstaLogeado ( FALSE );
		
		// Al empezar no está logeado Y EL TIPO ES -1
		$this->setTIPO ( - 1 );
		
		// Al empezar no es admin
		$this->setSESSION ( 'SESSION_ADMIN', FALSE );
		
		// Iniciamos sesion
		$this->InciarSesion ();
	}
	
	// El usuario inicia la sesión
	public function InciarSesion() {
		global $BD;
		global $cUTIL;
		global $cAUDIT;
		global $IDIOMA, $language;
		
		$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [9] );
		
		// Accedemos a la sesion
		if (!session_start ()) {
			 /* PANIC SI NO ESTÁ LA SESSIÓN BIEN ABIERTA */
		   $cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [86] );
		   echo $language [$IDIOMA] [86];
		   die;
		}
		
		// Comprobamos si está logeado
		$l = $this->ComprobarLogin ();
		
		// Almaceno el resultado de si estoy o no logeado
		$this->setEstaLogeado ( $l );
		
		// Borrar usuarios inactivos antes de acceder a cada sesion
		$BD->BorrarUsuariosInactivos ();
		$BD->BorrarInvitadosInactivos ();
		$BD->BorrarUsuariosInactivosPendingActivate ();
		
		// Si no estoy logueado
		if ($this->getEstaLogeado () == FALSE) {
			
			// Buscamos el invitado y lo actualizamos
			if (! $BD->BuscarInvitadoActivo ( $this->getSESSION ( 'SESSION_IP' ), $this->getSESSION ( 'SESSION_ID' ) ))
				// Si no está los añadimos
				$BD->AnadirInvitadoActivo ( $this->getSESSION ( 'SESSION_IP' ), $this->getSESSION ( 'SESSION_ID' ), $this->getSESSION ( 'SESSION_TIME' ) );
		  else
		    // Mostramos en el LOG que ya está la sesión abierta con esa SESSION_ID
		    $cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [12] . " [ " . $this->getSESSION ( 'SESSION_NAME' ) . " ] email: [ " . $this->getSESSION ( 'SESSION_EMAIL' ) . " ] session: [ " . $this->getSESSION ( 'SESSION_ID' ) . " ] " . $language [$IDIOMA] [56] . " " . date ( " [d/m/Y - H:i:s:u ]", $this->getSESSION ( 'SESSION_TIME' ) ) . " Err: [ " . $this->getSESSION ( 'SESSION_ERROR' ) . " ]" . " IP: [ " . $this->getSESSION ( 'SESSION_IP' ) . " ]" );
				
			// Actualizamos los campos de la sesión
			$BD->ActualizarCampo ( TABLA_INVITADOS, 'connect_type',    $cUTIL->getDEVICE_VAR ( 0 ), 'id', $this->getSESSION ( 'SESSION_ID' ) );
			$BD->ActualizarCampo ( TABLA_INVITADOS, 'HTTP_USER_AGENT', $cUTIL->getDEVICE_VAR ( 1 ), 'id', $this->getSESSION ( 'SESSION_ID' ) );
			$BD->ActualizarCampo ( TABLA_INVITADOS, 'info',            $cUTIL->getDEVICE_VAR ( 2 ), 'id', $this->getSESSION ( 'SESSION_ID' ) );
			} else {
		  // Si estoy logueado 
			$BD->AnadirUsuarioActivo ( $this->getSESSION ( 'SESSION_EMAIL' ), $this->getSESSION ( 'SESSION_TIME' ) );
			$BD->BorrarInvitadoActivo ( $this->getSESSION ( 'SESSION_ID' ) );
		}
	}
	
 	public function SESSION_PROCESO_Logout ( $email ) {
		global $IDIOMA, $language;
		global $BD;
		global $s;
		global $cNET;
		global $cAUDIT;
		// Desconectar al usuario
		
		$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [54] . " [ " . $s->getSESSION ( 'SESSION_NAME' ) . " ] email: [ " . $email . " ] session: [ " . $s->getSESSION ( 'SESSION_ID' ) . " ] " . $language [$IDIOMA] [56] . " " . date ( " [d/m/Y - H:i:s:u ]", $s->getSESSION ( 'SESSION_TIME' ) ) . " Err: [ " . $s->getSESSION ( 'SESSION_ERROR' ) . " ]" . " IP: [ " . $s->getSESSION ( 'SESSION_IP' ) . " ]" );
		
		// Actualizamos datos de la BD, el campo Userid con su id generado aleatoriamente
		$BD->ActualizarCampo ( TABLA_USUARIOS, 'userid', 0, 'email', $email );
		$BD->ActualizarCampo ( TABLA_USUARIOS, 'timestamp', 0, 'email', $email );
		$BD->ActualizarCampo ( TABLA_USUARIOS, 'FIRST_LOGIN_FAIL', 0, 'email', $email );
		$BD->ActualizarCampo ( TABLA_USUARIOS, 'LOGIN_FAIL', 0, 'email', $email );
		
	  $BD->DesconexionUsuario ( $email );
		
		$s->setSESSION ( 'SESSION_NAME', NOMBRE_INVITADO );
		$s->setSESSION ( 'SESSION_ID', $s->generarIDAleatorio () );
		$s->setSESSION ( 'SESSION_EMAIL', NOMBRE_INVITADO . '@' . NOMBRE_INVITADO . '.org' );
		$s->setSESSION ( 'SESSION_TIME', $s->getTIMESTAMP () );
		$s->setSESSION ( 'SESSION_ERROR', 0 );
		$s->setSESSION ( 'SESSION_IP', $cNET->getIP () );
		$s->setSESSION ( 'SESSION_ADMIN', FALSE );
		$s->setSESSION ( 'SESSION_CONNECT_MODE', CONNECT_NULL );
		
		$BD->AnadirInvitadoActivo ( $s->getSESSION ( 'SESSION_IP' ), $s->getSESSION ( 'SESSION_ID' ), $s->getSESSION ( 'SESSION_TIME' ) );
		
		$BD->calcNumInvitadosActivos ();
		$BD->calcNumUsuariosActivos ();
		
		$this->setEstaLogeado ( FALSE );
		
		// No estoy logueado por expiracion de tiempo
		return 1; 		
 	}	
	
	
	public function ComprobarCaducidadFechaSesion($pFECHA_SESSION, $pPARAMETRO) {
		
		// Fecha de la Sesion "[ ".date("[d/m/Y - H:i:s:u ]", $pFECHA_SESSION )."</br >";
		// Fecha Actual echo time()."</br >";
		// Tiempo que se ha excedido echo time()-$this->getSESSION ( 'SESSION_TIME' )."</br >";
		// Tiempo que queda para que expire la sesion (TIME_INVITADO-(time()-$this->getSESSION ( 'SESSION_TIME' )));
		if ((time () - $pFECHA_SESSION) > ($pPARAMETRO * 60))
			return true;
		else
			return false;
	}
	
	// Se comprueba si el pass y login introducidos son correctos
	public function ComprobarLogin() {
		global $BD;
		global $cAUDIT;
		global $cNET;
		global $IDIOMA, $language;
		
		$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [11] );
		
		// Comprobamos si las varibles de sesión están activas, aunque esto no indique que el usuario lo esté, puede estar caducado o haberse 
		// cerrado la sesión por la APP MOVIL.
		if (($this->defSESSION ( 'SESSION_NAME' ) && ($this->getSESSION ( 'SESSION_NAME' ) != NOMBRE_INVITADO)) && ($this->defSESSION ( 'SESSION_ID' ) && ($this->getSESSION ( 'SESSION_ID' ) != '')) && ($this->defSESSION ( 'SESSION_EMAIL' ) && ($cNET->check_email_address ( $this->getSESSION ( 'SESSION_EMAIL' ) ))) && ($this->defSESSION ( 'SESSION_TIME' ) && ($this->getSESSION ( 'SESSION_TIME' ) > 0) && ($this->getSESSION ( 'SESSION_TIME' ) <= time ())) && ($this->defSESSION ( 'SESSION_ERROR' ) && ($this->getSESSION ( 'SESSION_ERROR' ) == 0)) && ($this->defSESSION ( 'SESSION_IP' ) && ($cNET->is_valid_ip ( $this->getSESSION ( 'SESSION_IP' ), true )))) {
			// Variables de sesion presentes
			$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [16] . " [ " . $this->getSESSION ( 'SESSION_NAME' ) . " ] email: [ " . $this->getSESSION ( 'SESSION_EMAIL' ) . " ] session: [ " . $this->getSESSION ( 'SESSION_ID' ) . " ] " . $language [$IDIOMA] [56] . " " . date ( " [d/m/Y - H:i:s:u ]", $this->getSESSION ( 'SESSION_TIME' ) ) . " Err: [ " . $this->getSESSION ( 'SESSION_ERROR' ) . " ]" . " IP: [ " . $this->getSESSION ( 'SESSION_IP' ) . " ]" );
			
		  // Es posible cerrar la sesión por la APP MOVIL y tener las variables de sesión de la web activas por una sesión anterior en la web
		  // y por eso hay que comprobar si las variables de sesión son están activas pero el usuario en bd está ya cerrado 
			
			// Si estoy ya logueado solo tengo que comprobar si ha expirado mi sesion
			if (
			    ($this->ComprobarCaducidadFechaSesion ( $this->getSESSION ( 'SESSION_TIME' ), TIME_USUARIO ))
			    ||
			    (!$this->getEstaLogueadoEnBD ( $this->getSESSION ( 'SESSION_EMAIL' ) ) )
			   ) {
			  
				// Desconectar al usuario
				$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [24] . " [ " . $this->getSESSION ( 'SESSION_NAME' ) . " ] email: [ " . $this->getSESSION ( 'SESSION_EMAIL' ) . " ] session: [ " . $this->getSESSION ( 'SESSION_ID' ) . " ] " . $language [$IDIOMA] [56] . " " . date ( " [d/m/Y - H:i:s:u ]", $this->getSESSION ( 'SESSION_TIME' ) ) . " Err: [ " . $this->getSESSION ( 'SESSION_ERROR' ) . " ]" . " IP: [ " . $this->getSESSION ( 'SESSION_IP' ) . " ]" );
				
				// Actualizamos datos de la BD, el campo Userid con su id generado aleatoriamente
				$BD->ActualizarCampo ( TABLA_USUARIOS, 'userid', 0, 'email', $this->getSESSION ( 'SESSION_EMAIL' ) );
				$BD->ActualizarCampo ( TABLA_USUARIOS, 'timestamp', 0, 'email', $this->getSESSION ( 'SESSION_EMAIL' ) );
				$BD->ActualizarCampo ( TABLA_USUARIOS, 'FIRST_LOGIN_FAIL', 0, 'email', $this->getSESSION ( 'SESSION_EMAIL' ) );
				$BD->ActualizarCampo ( TABLA_USUARIOS, 'LOGIN_FAIL', 0, 'email', $this->getSESSION ( 'SESSION_EMAIL' ) );

	      //$BD->DesBloquearUsuario ( $pEMAIL );
				$BD->DesBloquearUsuario ( $this->getSESSION ( 'SESSION_EMAIL' ) );
				
				$this->setSESSION ( 'SESSION_NAME', NOMBRE_INVITADO );
				$this->setSESSION ( 'SESSION_ID', $this->generarIDAleatorio () );
				$this->setSESSION ( 'SESSION_EMAIL', NOMBRE_INVITADO . '@' . NOMBRE_INVITADO . '.org' );
				$this->setSESSION ( 'SESSION_TIME', $this->getTIMESTAMP () );
				$this->setSESSION ( 'SESSION_ERROR', 0 );
				$this->setSESSION ( 'SESSION_IP', $cNET->getIP () );
				$this->setSESSION ( 'SESSION_ADMIN', FALSE );
				$this->setSESSION ( 'SESSION_CONNECT_MODE', CONNECT_NULL );
				$this->setSESSION ( 'SESSION_FORM_OPERATION', FORM_OPERATION_NULL );
				
				$BD->AnadirInvitadoActivo ( $this->getSESSION ( 'SESSION_IP' ), $this->getSESSION ( 'SESSION_ID' ), $this->getSESSION ( 'SESSION_TIME' ) );
				
				$BD->calcNumInvitadosActivos ();
				$BD->calcNumUsuariosActivos ();
				
				$this->setEstaLogeado ( FALSE );
				
				// No estoy logueado por expiracion de tiempo
				return false;
			}
			
			// Estoy logueado
			return true;
		} else {
		  
		  // Es un invitado
			// Si ya existen datos los reciclamos o si la sesión del invitado ha caducado por exceso de tiempo
			// Aquí debemos mirar si la sesión de invitado caduca y si ha caducado generar una nueva
			if (($this->defSESSION ( 'SESSION_NAME' ) && ($this->getSESSION ( 'SESSION_NAME' ) == NOMBRE_INVITADO)) && ($this->defSESSION ( 'SESSION_ID' ) && ($this->getSESSION ( 'SESSION_ID' ) != '')) && ($this->defSESSION ( 'SESSION_EMAIL' ) && ($cNET->check_email_address ( $this->getSESSION ( 'SESSION_EMAIL' ) ))) && ($this->defSESSION ( 'SESSION_TIME' ) && ($this->getSESSION ( 'SESSION_TIME' ) > 0) && ($this->getSESSION ( 'SESSION_TIME' ) <= time ())) && ($this->defSESSION ( 'SESSION_ERROR' ) && ($this->getSESSION ( 'SESSION_ERROR' ) >= 0)) && ($this->defSESSION ( 'SESSION_IP' ) && ($cNET->is_valid_ip ( $this->getSESSION ( 'SESSION_IP' ), true )))) {
				$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [12] . " [ " . $this->getSESSION ( 'SESSION_NAME' ) . " ] email: [ " . $this->getSESSION ( 'SESSION_EMAIL' ) . " ] session: [ " . $this->getSESSION ( 'SESSION_ID' ) . " ] " . $language [$IDIOMA] [56] . " " . date ( " [d/m/Y - H:i:s:u ]", $this->getSESSION ( 'SESSION_TIME' ) ) . " Err: [ " . $this->getSESSION ( 'SESSION_ERROR' ) . " ]" . " IP: [ " . $this->getSESSION ( 'SESSION_IP' ) . " ]" );
				
				// Si ha caducado la sesión debo restaurar el id y el time
				if ($this->ComprobarCaducidadFechaSesion ( $this->getSESSION ( 'SESSION_TIME' ), TIME_INVITADO )) {
					
					$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [10] . " [ " . $this->getSESSION ( 'SESSION_ID' ) . " ] " );
					$this->setSESSION ( 'SESSION_ID', $this->generarIDAleatorio () );
					$this->setSESSION ( 'SESSION_TIME', $this->getTIMESTAMP () );
					$this->setSESSION ( 'SESSION_ERROR', 0 );
					$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [12] . " [ " . $this->getSESSION ( 'SESSION_NAME' ) . " ] email: [ " . $this->getSESSION ( 'SESSION_EMAIL' ) . " ] session: [ " . $this->getSESSION ( 'SESSION_ID' ) . " ] " . $language [$IDIOMA] [56] . " " . date ( " [d/m/Y - H:i:s:u ]", $this->getSESSION ( 'SESSION_TIME' ) ) . " Err: [ " . $this->getSESSION ( 'SESSION_ERROR' ) . " ]" . " IP: [ " . $this->getSESSION ( 'SESSION_IP' ) . " ]" );
					
					// COMPROBAR AQUIÍ SI ES ADMIN HACIENDO UNA CONSULTA A LA BASES DE DATOS
					// Y PONER //$this->setSESSION ( 'SESSION_ADMIN', FALSE O FALSE );
				}
				
			} else {
			  
				// Como no está definido el usuario definimos nostros sus variables
				$this->setSESSION ( 'SESSION_NAME', NOMBRE_INVITADO );
				$this->setSESSION ( 'SESSION_ID', $this->generarIDAleatorio () );
				$this->setSESSION ( 'SESSION_EMAIL', NOMBRE_INVITADO . '@' . NOMBRE_INVITADO . '.org' );
				$this->setSESSION ( 'SESSION_TIME', $this->getTIMESTAMP () );
				$this->setSESSION ( 'SESSION_ERROR', 0 );
				$this->setSESSION ( 'SESSION_IP', $cNET->getIP () );
				$this->setSESSION ( 'SESSION_ADMIN', FALSE );
				$this->setSESSION ( 'SESSION_CONNECT_MODE', CONNECT_NULL );
				$this->setSESSION ( 'SESSION_FORM_OPERATION', FORM_OPERATION_NULL );
				
				$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [15] . " [ " . $this->getSESSION ( 'SESSION_NAME' ) . " ] email: [ " . $this->getSESSION ( 'SESSION_EMAIL' ) . " ] session: [ " . $this->getSESSION ( 'SESSION_ID' ) . " ] " . $language [$IDIOMA] [56] . " " . date ( " [d/m/Y - H:i:s:u ]", $this->getSESSION ( 'SESSION_TIME' ) ) . " Err: [ " . $this->getSESSION ( 'SESSION_ERROR' ) . " ]" . " IP: [ " . $this->getSESSION ( 'SESSION_IP' ) . " ]" );
			}
			// No estoy logueado
			return false;
		}
	}
	
	// Genera un ID aleatorio por si es la primera vez que entra
	public function generarIDAleatorio() {
		$ID = md5 ( $this->generarStrAleatorio ( 30 ) );
		return $ID;
	}
	
	public function RegistrarConexion ( $json ) {
	  global $BD;
    
    
		try {
			$BD->InsertConexion (  
       			            $json['INFO_OPERATION']['OPERATION'],
       			            $json['INFO_OPERATION']['USERNAME'],
       			            $json['INFO_OPERATION']['PASSWORD'],
       			            $json['INFO_DEVICE']['VERSION_RELEASE'],
       			            $json['INFO_DEVICE']['HARDWARE'],
       			            $json['INFO_DEVICE']['UNKNOWN'],
       			            $json['INFO_DEVICE']['VERSION_SDK'],
       			            $json['INFO_DEVICE']['PRODUCT'],
       			            $json['INFO_DEVICE']['DISPLAY'],
       			            $json['INFO_DEVICE']['USER'],
       			            $json['INFO_DEVICE']['HOST'],
       			            $json['INFO_DEVICE']['DEVICE'],
       			            $json['INFO_DEVICE']['MODEL'],
       			            $json['INFO_DEVICE']['CPU_ABI'],
       			            $json['INFO_DEVICE']['OS_VERSION'],
       			            $json['INFO_DEVICE']['CPU_ABI2'],
       			            $json['INFO_DEVICE']['ID'],
       			            $json['INFO_DEVICE']['VERSION_INCREMENTAL'],
       			            $json['INFO_DEVICE']['MANUFACTURER'],
       			            $json['INFO_DEVICE']['BRAND'],
       			            $json['INFO_APP']['VERSION'],
       			            $json['INFO_APP']['NAME'],
       			            $json['INFO_APP']['ID_APP'] );
		} catch (Exception $e) {
			global $cAUDIT;
	    $cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "Error: " . $e->getMessage());
		}	 
	}
	
	public function CargarListasDeLaCompra ( $email ) {

    global $BD;
		try {
			return ( $BD->CargarListasDeLaCompra ( $email ) );
		} catch (Exception $e) {
			global $cAUDIT;
	    $cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "Error: " . $e->getMessage());
		}	 		
  }
  
 	public function CrearNuevaListaCompra ( $email, $name, $shared ) {

    global $BD;
		try {
			return ( $BD->CrearNuevaListaCompra ( $email, $name, $shared ) );
		} catch (Exception $e) {
			global $cAUDIT;
	    $cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, "Error: " . $e->getMessage());
		}	 		
  }
	
	// Genera un STR aleatorio
	public function generarStrAleatorio($pLONGITUD) {
		$strAleatorio = "";
		for($i = 0; $i < $pLONGITUD; $i ++) {
			$numAleatorio = mt_rand ( 0, 61 );
			if ($numAleatorio < 10) {
				$strAleatorio .= chr ( $numAleatorio + 48 );
			} else if ($numAleatorio < 36) {
				$strAleatorio .= chr ( $numAleatorio + 55 );
			} else {
				$strAleatorio .= chr ( $numAleatorio + 61 );
			}
		}
		return $strAleatorio;
	}
	
	// Proceso de login del usuario
	public function SESSION_PROCESO_Login($pEMAIL, $pPASSWORD, $connect_mode, $form_operation, $COD_APLICACION ) {
		global $BD;
		global $IDIOMA, $language;
		global $cAUDIT;
		global $cNET;
		
    $pEMAIL = trim ( mysql_real_escape_string ( $pEMAIL ));		
		$pPASSWORD = trim ( mysql_real_escape_string ( $pPASSWORD ));
		$connect_mode = trim ( mysql_real_escape_string ( $connect_mode ));
		$form_operation = trim ( mysql_real_escape_string ( $form_operation ));
		
		
		// Seteamos el error al iniciar
		$this->setSESSION ( 'SESSION_ERROR', 0 );
		
		if (! $pEMAIL || strlen ( $pEMAIL = trim ( $pEMAIL ) ) == 0) {
			// Definimos error
			$_SESSION ['SESSION_ERROR'] = $language [$IDIOMA] [20];
			$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [20] );
			return 0;
		}
		
		if (! $cNET->check_email_address ( $pEMAIL )) {
			// Definimos error
			$_SESSION ['SESSION_ERROR'] = $language [$IDIOMA] [21];
			$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [21] );
			return 0;
		}
		
		if (! $pPASSWORD) {
			// Definimos error
			$_SESSION ['SESSION_ERROR'] = $language [$IDIOMA] [22];
			$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [22] );
			return 0;
		}
		
		// Confirmamos si exsite el usuario en la BD
		$pEMAIL = stripslashes ( $pEMAIL );
		$pPASSWORD = stripslashes ( $pPASSWORD );
		$pPASSWORD = md5 ( $pPASSWORD );
		
		// Confirmamos si el usuario tiene acceso a la aplicación
		// Puede haber distintos tipos de acceso
		// APP_WEB
		// APP_MOVIL
		// APP_TABLE
		// Existe una tabla que controla que usuario tiene acceso en base a su distpositivo
		// Hay que comprobar que cada usuario tenga acceso en cada uno de los 3 dispositivos
		$r = $BD->ConfirmarUsuarioDispositivoAplicacion ( $COD_APLICACION, $connect_mode, $pEMAIL );
		if (!$r) {   
		  // Error de acceso modo de acceso erróneo
			$ret = 0;
			$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [113] );	
		} else {
				
				// Confirmamos la password del usuario
				$r = $BD->confirmarUsuarioID ( $pEMAIL, $pPASSWORD );

				if (! $r) {
					// Error de acceso
					$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [57] . " [ " . $pEMAIL . " ]" );	
					$BD->LastLoginFAIL ( $pEMAIL );
					return 0;
				} else {
		
						// Comprobamos si está bloqueado el usuario
						$campo = $BD->GetCampo( TABLA_USUARIOS, "STATUS", "email", $pEMAIL );
						// Viene del fichero de constantes INACTIVE ACTIVE BLOCKED
						$status = unserialize ( LOGIN_STATUS );
						
						// Buscar que valor tiene el estado del usuario
						switch ($campo['STATUS']) {
								case $status[0]:
										// Usuario ACTIVO en este caso no pasa nada, me estoy logueando en otro equipo
										// ya que el usuario ya está activo en algún dispositivo
										$ret = 3;
										break;
								case $status[1]:
										// Usuario INACTIVO, me estoy logueando y no hay ningún usuario activo con este nombre de usuario
										$ret = 4; 
										break;
								case $status[2]:
										// Usuario BLOQUEADO, debo mostrar un error.
										$ret = 5;
										break;
								case $status[3]:
										// Usuario PENDING_ACTIVATE, debo activarlo haciendo click en la url que me ha llegado por correo
										$ret = 6;
						}
						
					 // Si no es un usuario bloqueado
					 if (($ret != 5) && ($ret != 6)) {
						 // Acceso ok
						 // Si soy administrador
						 if ($r ['TIPO'] == 0) {
								$this->setSESSION ( 'SESSION_ADMIN', TRUE );
								$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [52] . " [ " . $this->getSESSION ( 'SESSION_NAME' ) . " ] email: [ " . $this->getSESSION ( 'SESSION_EMAIL' ) . " ] session: [ " . $this->getSESSION ( 'SESSION_ID' ) . " ] " . $language [$IDIOMA] [56] . " " . date ( " [d/m/Y - H:i:s:u ]", $this->getSESSION ( 'SESSION_TIME' ) ) . " Err: [ " . $this->getSESSION ( 'SESSION_ERROR' ) . " ]" . " IP: [ " . $this->getSESSION ( 'SESSION_IP' ) . " ]" );
						 } else {
								$this->setSESSION ( 'SESSION_ADMIN', FALSE );
								$cAUDIT->AddAudit ( AUDIT_APP, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [51] . " [ " . $this->getSESSION ( 'SESSION_NAME' ) . " ] email: [ " . $this->getSESSION ( 'SESSION_EMAIL' ) . " ] session: [ " . $this->getSESSION ( 'SESSION_ID' ) . " ] " . $language [$IDIOMA] [56] . " " . date ( " [d/m/Y - H:i:s:u ]", $this->getSESSION ( 'SESSION_TIME' ) ) . " Err: [ " . $this->getSESSION ( 'SESSION_ERROR' ) . " ]" . " IP: [ " . $this->getSESSION ( 'SESSION_IP' ) . " ]" );
						 }
			
						 // Establecemos el tipo
						 $this->setTIPO ( $r ['TIPO'] );
			
						 $this->setSESSION ( 'SESSION_NAME', $r ['USER'] );
						 $this->setSESSION ( 'SESSION_TIME', $this->getTIMESTAMP () );
						 $this->setSESSION ( 'SESSION_ERROR', 0 );
						 $this->setSESSION ( 'SESSION_EMAIL', $pEMAIL );
						 $this->setSESSION ( 'SESSION_IP', $cNET->getIP () );
						 $this->setSESSION ( 'SESSION_CONNECT_MODE', $connect_mode );
						 $this->setSESSION ( 'SESSION_FORM_OPERATION', $form_operation );
			
						 // Actualizamos datos de la BD, el campo Userid con su id generado aleatoriamente
						 $BD->ActualizarCampo ( TABLA_USUARIOS, 'userid', $this->getSESSION ( 'SESSION_ID' ), 'email', $pEMAIL );
						 // $BD->ActualizarCampo( TABLA_USUARIOS, 'timestamp', $this->getSESSION ( 'SESSION_TIME' ), 'email', $pEMAIL );
						 $BD->ActualizarCampoCount ( TABLA_USUARIOS, 'count', 'count+1', 'email', $pEMAIL );
						 $BD->ActualizarCampo ( TABLA_USUARIOS, 'FIRST_LOGIN_FAIL', 0, 'email', $pEMAIL );
						 $BD->ActualizarCampo ( TABLA_USUARIOS, 'LOGIN_FAIL', 0, 'email', $pEMAIL );
					 	
						 $BD->AnadirUsuarioActivo ( $pEMAIL, $this->getSESSION ( 'SESSION_TIME' ) );
						 $BD->BorrarInvitadoActivo ( $this->getSESSION ( 'SESSION_ID' ) );
					 	
						 $this->setEstaLogeado ( TRUE );
			
						 // Establecemos los datos de los usuarios que se conectan correctamente
						 $BD->LastLoginOK ( $pEMAIL );
						 $BD->DesBloquearUsuario ( $pEMAIL );
					 }
					 return $ret;
				}
		}
		return $ret;
	}
	
	// Proceso de login del usuario
	public function SESSION_PROCESO_FIND_USER($pEMAIL ) {
		global $BD;
		
		$r = $BD->UserFindEmail ( $pEMAIL );
		
		// Devuelve el número de filas insertadas
		return $r;
	}
	
	// Proceso de creación del usuario
	public function SESSION_Create_User($pEMAIL, $password ) {
		global $BD;
		
		$r = $BD->CreateUser ( $pEMAIL, $password );
		
		return $r;
	}
	
	public function getEstaLogueadoEnBD ( $pEMAIL ) {
		global $BD;
		
		$r = $BD->getEstaLogueadoEnBD ( $pEMAIL );
		
		if ($r) 
		  return true;
		else 
		  return false;
	}
	private static $_instance;
	public static function getInstance() {
		if (! (self::$_instance instanceof self)) {
			self::$_instance = new self ();
		}
		return self::$_instance;
	}
}
;

// Se crea la instancia de sesión
try {
	$s = c_sesion::getInstance ();
} catch ( Exception $e ) {
	global $cAUDIT;
	global $IDIOMA, $language;
	
	$cAUDIT->AddAudit ( AUDIT_EXTEND, __DIR__, __FILE__, __LINE__, __CLASS__, __METHOD__, __FUNCTION__, $language [$IDIOMA] [2] . $e->getMessage () );
}

?>
